package cn.git.shiro.config;

import cn.git.shiro.constant.ShiroJWTConstant;
import cn.git.shiro.filter.CustomJWTFilter;
import cn.git.shiro.relam.CustomRealm;
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: shiro通用配置类
 * @program: bank-credit-sy
 * @author: lixuchun
 * @create: 2024-03-27
 */
@Configuration
public class CommonShiroConfig {

    @Autowired
    private CustomJWTFilter customJWTFilter;

    /**
     * 创建并配置DefaultWebSecurityManager实例。
     * 该方法不接受任何参数，返回配置好的DefaultWebSecurityManager实例。
     * 主要进行以下配置：
     * 1. 设置自定义的Realm。
     * 2. 配置SubjectDAO以禁用session存储
     *
     * @return 配置好的DefaultWebSecurityManager实例。
     */
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(CustomRealm customRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 给安全管理器设置realm
        securityManager.setRealm(customRealm);
        // 关闭shiro的session（无状态的方式使用shiro）
        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
        securityManager.setSubjectDAO(subjectDAO);
        return securityManager;
    }

    /**
     * 创建并配置 ShiroFilterFactoryBean 实例。
     *
     * @param defaultWebSecurityManager Shiro 的 Web 安全管理器，用于管理安全逻辑和权限控制。
     * @return 配置好的 ShiroFilterFactoryBean 实例，它定义了 Shiro 过滤器链和相关配置。
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        // 设置登录URL
        shiroFilterFactoryBean.setLoginUrl(ShiroJWTConstant.LOGIN_PATH);
        // 定义自定义过滤器并映射到名称
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put(ShiroJWTConstant.JWT_FILTER, customJWTFilter);
        shiroFilterFactoryBean.setFilters(filterMap);
        // 定义过滤链，指定哪些 URL 用哪些过滤器处理
        Map<String, String> map = new HashMap<>();
        map.put(ShiroJWTConstant.LOGIN_PATH, ShiroJWTConstant.ANON);
        map.put(ShiroJWTConstant.LOGOUT_PATH, ShiroJWTConstant.ANON);
        map.put(ShiroJWTConstant.ALL_PATH, ShiroJWTConstant.JWT_FILTER);
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }

}
